﻿/*=====================================================================
  
    File:      TabularDatabase.RoleMember.cs

    Summary:   This is the class that implements all related functionality 
               around Role Members in a tabular model, for all TabularDatabase 
               commandlets.
 
               Tabular Database Cmdlets (TabularDatabaseCmdlets) is sample code 
               to show and explain how to use the AMO to Tabular (AMO2Tabular)
               library to build a PowerShell library of cmdlets to manage 
               Tabular model objects. 
               The sample can be seen as a sample library of cmdlets
               with the necessary code to execute each particular 
               action or operation over a logical tabular object. 

    Authors:   JuanPablo Jofre (jpjofre@microsoft.com)
    Date:	   04-Apr-2012
  
    Change history:

    @TODO: 
  
-----------------------------------------------------------------------
  
    This file is part of the Microsoft SQL Server Code Samples.
    Copyright (C) Microsoft Corporation.  All rights reserved.
  
  This source code is intended only as a supplement to Microsoft
  Development Tools and/or on-line documentation.  
  
  THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF 
  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  PARTICULAR PURPOSE.
  
======================================================================*/


using System;
using System.Globalization;
using System.Management.Automation;     //  Windows PowerShell assembly.
using MicrosoftSql2012Samples.Amo2Tabular;
using MicrosoftSql2012Samples.TabularDatabaseCmdlet.Properties;
using AMO = Microsoft.AnalysisServices;

namespace MicrosoftSql2012Samples.TabularDatabaseCmdlet
{
    [Cmdlet(VerbsCommon.Add, "RoleMemberToTabularRole")]
    public class AddRoleMemberToTabularRole : TabularDatabaseBase
    {
        //  Declare mandatory parameters

        [Parameter(Mandatory = true, Position = 2)]
        [ValidateNotNullOrEmpty]
        public string roleName { get; set; }

        [Parameter(Mandatory = true, Position = 3)]
        [ValidateNotNullOrEmpty]
        public string windowsUserOrGroup { get; set; }


        // Overide the ProcessRecord method to add a Role Member
        // using the supplied server name and database name 
        protected override void ProcessRecord()
        {
            using (AMO.Server server = new AMO.Server())
            {
                try
                {
                    server.Connect(serverName);
                    using (AMO.Database database = server.Databases.GetByName(databaseName))
                    {
                        AMO2Tabular.RoleMemberAdd(database, roleName, windowsUserOrGroup, true);
                        WriteVerbose(string.Format(CultureInfo.InvariantCulture, Resources.AddRoleMemberToTabularRoleWriteReport, windowsUserOrGroup, roleName));
                    }
                }
                catch (Exception ex)
                {
                    ThrowTerminatingError(new ErrorRecord(ex, string.Format(CultureInfo.InvariantCulture, Resources.AddTabularFirstTableTerminatingError, databaseName, serverName), ErrorCategory.InvalidOperation, null));
                }
            }

        }

    }

    [Cmdlet(VerbsCommon.Remove, "RoleMemberFromTabularRole")]
    public class RemoveRoleMemberFromTabularRole : TabularDatabaseBase
    {
        //  Declare mandatory parameters

        [Parameter(Mandatory = true, Position = 2)]
        [ValidateNotNullOrEmpty]
        public string roleName { get; set; }

        [Parameter(Mandatory = true, Position = 3)]
        [ValidateNotNullOrEmpty]
        public string windowsUserOrGroup { get; set; }


        // Overide the ProcessRecord method to add a Role Member
        // using the supplied server name and database name 
        protected override void ProcessRecord()
        {
            using (AMO.Server server = new AMO.Server())
            {
                try
                {
                    server.Connect(serverName);
                    using (AMO.Database database = server.Databases.GetByName(databaseName))
                    {
                        AMO2Tabular.RoleMemberDrop(database, roleName, windowsUserOrGroup, true);
                        WriteVerbose(string.Format(CultureInfo.InvariantCulture, Resources.RemoveRoleMemberFromTabularRoleWriteReport, windowsUserOrGroup, roleName));
                    }
                }
                catch (Exception ex)
                {
                    ThrowTerminatingError(new ErrorRecord(ex, string.Format(CultureInfo.InvariantCulture, Resources.AddTabularTableTerminatingError, databaseName, serverName), ErrorCategory.InvalidOperation, null));
                }
            }

        }

    }
}
